JS中的堆栈内存释放

JS中的内存分为堆内存和栈内存

堆内存:存放引用类型数据的值(对象:键值对,函数:代码字符串)

栈内存:提供代码执行的环境,以及存放基本类型值

【堆内存的释放】:让所有引用堆内存空间地址的变量赋值为null(即没有变量占用这个堆内存),浏览器会在空闲的时候自动将其释放

【栈内存的释放】:一般情况下,当函数执行完成,所形成的私有作用域(栈内存)都会自动释放掉(在栈内存中存储的值也都会释放掉),但是也有特殊不销毁的情况。

【特殊不销毁栈内存的情况】

1、函数执行完成后,当前形成的栈内存中,某些内容被栈内存以外的变量占用了(触发闭包机制),此时栈内存不能释放(一旦释放外面将会找不到原有的内容了)

2、全局栈内存(也就是window环境)只有在页面关闭的时候,或者页面刷新的时候,才会被释放掉

如果当前栈内存没有被释放,那么之前在栈内存中存储的基本值也不会被释放,能够一直保存下来

    var i = 1;
    function fn(i) {
       return function(n) {
         console.log(n + (++i));
       }
    }
    var f = fn(2); //  i:2
    f(3); // n:3 i:3 输出 6
    fn(5)(6); // 第一步i:5  第二步:输出12
    fn(7)(8); //第一步i:7 第二步:输出16
    f(4);//8此时在第二次执行f的时候,由于第一次的执行f后的栈内存并没有被释放掉,所以i的值还是第一次执行之后的3,++i之后i的值为4,传入n的值为4,输出结果为4+4=8